package io.bd;

import io.ItemAgenda;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

/**
 *
 * @author Mariano Zapata
 */
public class ABMRAgenda {
    
    private Connection conexion;
    
    public ABMRAgenda(Connection conexion) {
        this.conexion= conexion;
    }
    
    public List<ItemAgenda> recuperar(String fecha) throws SQLException
    {
        List<ItemAgenda> items= new ArrayList<ItemAgenda>();
        String renglon= "SELECT * FROM Agenda WHERE fecha= ? ORDER BY hora";
        PreparedStatement consulta= conexion.prepareStatement(renglon);
        consulta.setDate(1, this.transformarFecha(fecha));
        ResultSet r= consulta.executeQuery();
        while (r.next())
        {
            ItemAgenda i= new ItemAgenda(r.getLong(1));
            i.setFecha(this.transformarFecha(r.getDate(2)));
            i.setHora(this.transformarHora(r.getTime(3)));
            i.setTexto(r.getString(4));
            i.setEsImportante(r.getBoolean(5));
            items.add(i);
        }
        r.close();
        consulta.close();
        return items;
    }
    
    public void eliminar(ItemAgenda i) throws SQLException
    {
        String renglon= "DELETE FROM Agenda WHERE id= " + i.getId();
        Statement consulta= conexion.createStatement();
        consulta.executeUpdate(renglon);
        consulta.close();
    }
    
    public void crear(ItemAgenda i) throws SQLException
    {
        String renglon= "INSERT INTO Agenda (fecha, hora, texto, es_importante) VALUES (?, ?, ?, ?)";
        PreparedStatement consulta= conexion.prepareStatement(renglon);
        consulta.setDate(1, this.transformarFecha(i.getFecha()));
        consulta.setTime(2, this.transformarHora(i.getHora()));
        consulta.setString(3, i.getTexto());
        consulta.setBoolean(4, i.getEsImportante());
        consulta.executeUpdate();
        consulta.close();
    }
    
    public void modificar(ItemAgenda i) throws SQLException
    {
        String renglon= "UPDATE Agenda SET fecha= ?, hora= ?, texto= ?, es_importante= ? WHERE id= ?";
        PreparedStatement consulta= conexion.prepareStatement(renglon);
        consulta.setDate(1, this.transformarFecha(i.getFecha()));
        consulta.setTime(2, this.transformarHora(i.getHora()));
        consulta.setString(3, i.getTexto());
        consulta.setBoolean(4, i.getEsImportante());
        consulta.setLong(5, i.getId());
        consulta.executeUpdate();
        consulta.close();
    }
    
    public boolean existe(ItemAgenda i) throws SQLException
    {
        String renglon= "SELECT id FROM Agenda WHERE id= " + i.getId();
        Statement consulta= conexion.createStatement();
        ResultSet r= consulta.executeQuery(renglon);
        boolean retorno= r.next();
        r.close();
        consulta.close();
        return retorno;
    }
    
    public List<ItemAgenda> obtenerProximosEventos(String fechaHoy, String horaActual) throws SQLException
    {
        ArrayList<ItemAgenda> ret= new ArrayList<ItemAgenda>();
        java.sql.Date fecha= this.transformarFecha(fechaHoy);
        String renglon= "SELECT hora FROM Agenda WHERE fecha= ? AND hora > ? ORDER BY hora ASC LIMIT 1";
        PreparedStatement consultaTemp= conexion.prepareStatement(renglon);
        consultaTemp.setDate(1, fecha);
        consultaTemp.setTime(2, this.transformarHora(horaActual));
        ResultSet r= consultaTemp.executeQuery();
        if (!r.next())
            return ret;
        java.sql.Time proxima= r.getTime(1);
        consultaTemp.close();
        renglon= "SELECT * FROM Agenda WHERE fecha= ? AND hora= ?";
        PreparedStatement consulta= conexion.prepareStatement(renglon);
        consulta.setDate(1, fecha);
        consulta.setTime(2, proxima);
        r= consulta.executeQuery();
        String proximaTransformada= this.transformarHora(proxima);
        while (r.next())
        {
            ItemAgenda i= new ItemAgenda(r.getLong(1));
            i.setFecha(fechaHoy);
            i.setHora(proximaTransformada);
            i.setTexto(r.getString(4));
            i.setEsImportante(r.getBoolean(5));
            ret.add(i);
        }
        r.close();
        consulta.close();
        return ret;
    }

    public List<Integer> obtenerDiasConEventosImportantes(String fechaInicio, String fechaFin) throws SQLException
    {
        List<Integer> ret= new ArrayList<Integer>();
        String renglon= "SELECT fecha FROM Agenda WHERE es_importante= true AND fecha BETWEEN ? AND ?";
        PreparedStatement consulta= conexion.prepareStatement(renglon);
        consulta.setDate(1, this.transformarFecha(fechaInicio));
        consulta.setDate(2, this.transformarFecha(fechaFin));
        ResultSet r= consulta.executeQuery();
        while (r.next())
        {
            java.sql.Date sqlFecha= r.getDate(1);
            java.util.Date utilFecha= new java.util.Date(sqlFecha.getTime());
            Calendar calendarFecha= Calendar.getInstance();
            calendarFecha.clear();
            calendarFecha.setTime(utilFecha);
            ret.add(calendarFecha.get(Calendar.DATE));
        }
        r.close();
        consulta.close();
        return ret;
    }
    
    private String transformarFecha(java.sql.Date sqlFecha)
    {
        java.util.Date utilFecha= new java.util.Date(sqlFecha.getTime());
        Calendar calendarFecha= Calendar.getInstance();
        calendarFecha.clear();
        calendarFecha.setTime(utilFecha);
        String ret= this.corregirFecha(calendarFecha.get(Calendar.DATE)) + "/" +
                this.corregirFecha(calendarFecha.get(Calendar.MONTH) + 1) + "/" + calendarFecha.get(Calendar.YEAR);
        return ret;
    }

    private String corregirFecha(int valor)
    {
        if (valor < 10)
            return "0" + valor;
        else
            return String.valueOf(valor);
    }
    
    private java.sql.Date transformarFecha(String fecha)
    {
        String [] atomo= fecha.split("/");
        Calendar calendarFecha= Calendar.getInstance();
        calendarFecha.clear();
        calendarFecha.set(Integer.parseInt(atomo[2]), (Integer.parseInt(atomo[1]) - 1), Integer.parseInt(atomo[0]));
        java.sql.Date sqlFecha= new java.sql.Date(calendarFecha.getTimeInMillis());
        return sqlFecha;
    }
    
    private String transformarHora(java.sql.Time sqlHora)
    {
        java.util.Date utilHora= new java.util.Date(sqlHora.getTime());
        Calendar calendarHora= Calendar.getInstance();
        calendarHora.clear();
        calendarHora.setTime(utilHora);
        return this.corregirHora(calendarHora.get(Calendar.HOUR_OF_DAY), calendarHora.get(Calendar.MINUTE));
    }
    
    private java.sql.Time transformarHora(String hora)
    {
        String [] atomo= hora.split(":");
        Calendar calendarHora= Calendar.getInstance();
        calendarHora.clear();
        calendarHora.set(2013, 0, 1, Integer.parseInt(atomo[0]), Integer.parseInt(atomo[1]));
        java.sql.Time sqlHora= new java.sql.Time(calendarHora.getTimeInMillis());
        return sqlHora;
    }
    
    private String corregirHora(int h, int m)
    {
        String ret;
        if (h < 10)
            ret= "0" + h + ":";
        else
            ret= h + ":";
        if (m < 10)
            ret+= "0" + m;
        else
            ret+= m;
        return ret;
    }
}
